﻿using System;
using System.Security.Principal;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using padnug.Controllers;


namespace padnugSlMVC.Web.Tests.Controllers
{

    [TestClass]
    public class AccountControllerTest
    {

        //[TestMethod]
        //public void ChangePasswordGetReturnsView()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.ChangePassword();

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //}

        //[TestMethod]
        //public void ChangePasswordPostRedirectsOnSuccess()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    RedirectToRouteResult result = (RedirectToRouteResult)controller.ChangePassword("oldPass", "newPass", "newPass");

        //    // Assert
        //    Assert.AreEqual("ChangePasswordSuccess", result.RouteValues["action"]);
        //}

        //[TestMethod]
        //public void ChangePasswordPostReturnsViewIfCurrentPasswordNotSpecified()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.ChangePassword("", "newPassword", "newPassword");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("You must specify a current password.", result.ViewData.ModelState["currentPassword"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void ChangePasswordPostReturnsViewIfNewPasswordDoesNotMatchConfirmPassword()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.ChangePassword("currentPassword", "newPassword", "otherPassword");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("The new password and confirmation password do not match.", result.ViewData.ModelState["_FORM"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void ChangePasswordPostReturnsViewIfNewPasswordIsNull()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.ChangePassword("currentPassword", null, null);

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("You must specify a new password of 6 or more characters.", result.ViewData.ModelState["newPassword"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void ChangePasswordPostReturnsViewIfNewPasswordIsTooShort()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.ChangePassword("currentPassword", "12345", "12345");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("You must specify a new password of 6 or more characters.", result.ViewData.ModelState["newPassword"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void ChangePasswordPostReturnsViewIfProviderRejectsPassword()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.ChangePassword("oldPass", "badPass", "badPass");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("The current password is incorrect or the new password is invalid.", result.ViewData.ModelState["_FORM"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void ChangePasswordSuccess()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.ChangePasswordSuccess();

        //    // Assert
        //    Assert.IsNotNull(result);
        //}

        [TestMethod]
        public void ConstructorSetsProperties()
        {
            // Arrange
            IFormsAuthentication formsAuth = new MockFormsAuthenticationService();
            IMembershipService membershipService = new AccountMembershipService();

            // Act
            AccountController controller = new AccountController(formsAuth, membershipService);

            // Assert
            Assert.AreEqual(formsAuth, controller.FormsAuth, "FormsAuth property did not match.");
            Assert.AreEqual(membershipService, controller.MembershipService, "MembershipService property did not match.");
        }

        [TestMethod]
        public void ConstructorSetsPropertiesToDefaultValues()
        {
            // Act
            AccountController controller = new AccountController();

            // Assert
            Assert.IsNotNull(controller.FormsAuth, "FormsAuth property is null.");
            Assert.IsNotNull(controller.MembershipService, "MembershipService property is null.");
        }

        //[TestMethod]
        //public void LoginGet()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.LogOn();

        //    // Assert
        //    Assert.IsNotNull(result);
        //}

        //[TestMethod]
        //public void LoginPostRedirectsHomeIfLoginSuccessfulButNoReturnUrlGiven()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    RedirectToRouteResult result = (RedirectToRouteResult)controller.LogOn("someUser", "goodPass", true, null);

        //    // Assert
        //    Assert.AreEqual("Home", result.RouteValues["controller"]);
        //    Assert.AreEqual("Index", result.RouteValues["action"]);
        //}

        //[TestMethod]
        //public void LoginPostRedirectsToReturnUrlIfLoginSuccessfulAndReturnUrlGiven()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    RedirectResult result = (RedirectResult)controller.LogOn("someUser", "goodPass", false, "someUrl");

        //    // Assert
        //    Assert.AreEqual("someUrl", result.Url);
        //}

        //[TestMethod]
        //public void LoginPostReturnsViewIfPasswordNotSpecified()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.LogOn("username", "", true, null);

        //    // Assert
        //    Assert.AreEqual("You must specify a password.", result.ViewData.ModelState["password"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void LoginPostReturnsViewIfUsernameNotSpecified()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.LogOn("", "somePass", false, null);

        //    // Assert
        //    Assert.AreEqual("You must specify a username.", result.ViewData.ModelState["username"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void LoginPostReturnsViewIfUsernameOrPasswordIsIncorrect()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.LogOn("someUser", "badPass", true, null);

        //    // Assert
        //    Assert.AreEqual("The username or password provided is incorrect.", result.ViewData.ModelState["_FORM"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void LogOff()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    RedirectToRouteResult result = (RedirectToRouteResult)controller.LogOff();

        //    // Assert
        //    Assert.AreEqual("Home", result.RouteValues["controller"]);
        //    Assert.AreEqual("Index", result.RouteValues["action"]);
        //}

        //[TestMethod]
        //public void RegisterGet()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.Register();

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //}

        //[TestMethod]
        //public void RegisterPostRedirectsHomeIfRegistrationSuccessful()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    RedirectToRouteResult result = (RedirectToRouteResult)controller.Register("someUser", "email", "goodPass", "goodPass");

        //    // Assert
        //    Assert.AreEqual("Home", result.RouteValues["controller"]);
        //    Assert.AreEqual("Index", result.RouteValues["action"]);
        //}

        //[TestMethod]
        //public void RegisterPostReturnsViewIfEmailNotSpecified()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.Register("username", "", "password", "password");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("You must specify an email address.", result.ViewData.ModelState["email"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void RegisterPostReturnsViewIfNewPasswordDoesNotMatchConfirmPassword()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.Register("username", "email", "password", "password2");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("The new password and confirmation password do not match.", result.ViewData.ModelState["_FORM"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void RegisterPostReturnsViewIfPasswordIsNull()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.Register("username", "email", null, null);

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("You must specify a password of 6 or more characters.", result.ViewData.ModelState["password"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void RegisterPostReturnsViewIfPasswordIsTooShort()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.Register("username", "email", "12345", "12345");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("You must specify a password of 6 or more characters.", result.ViewData.ModelState["password"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void RegisterPostReturnsViewIfRegistrationFails()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.Register("someUser", "DuplicateUserName" /* error */, "badPass", "badPass");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("Username already exists. Please enter a different user name.", result.ViewData.ModelState["_FORM"].Errors[0].ErrorMessage);
        //}

        //[TestMethod]
        //public void RegisterPostReturnsViewIfUsernameNotSpecified()
        //{
        //    // Arrange
        //    AccountController controller = GetAccountController();

        //    // Act
        //    ViewResult result = (ViewResult)controller.Register("", "email", "password", "password");

        //    // Assert
        //    Assert.AreEqual(6, result.ViewData["PasswordLength"]);
        //    Assert.AreEqual("You must specify a username.", result.ViewData.ModelState["username"].Errors[0].ErrorMessage);
        //}

        //private static AccountController GetAccountController()
        //{
        //    IFormsAuthentication formsAuth = new MockFormsAuthenticationService();
        //    MembershipProvider membershipProvider = new MockMembershipProvider();
        //    AccountMembershipService membershipService = new AccountMembershipService(membershipProvider);
        //    AccountController controller = new AccountController(formsAuth, membershipService);
        //    ControllerContext controllerContext = new ControllerContext(new MockHttpContext(), new RouteData(), controller);
        //    controller.ControllerContext = controllerContext;
        //    return controller;
        //}

        public class MockFormsAuthenticationService : IFormsAuthentication
        {
            public void SignIn(string userName, bool createPersistentCookie)
            {
            }

            public void SignOut()
            {
            }
        }

        public class MockIdentity : IIdentity
        {
            public string AuthenticationType
            {
                get
                {
                    return "MockAuthentication";
                }
            }

            public bool IsAuthenticated
            {
                get
                {
                    return true;
                }
            }

            public string Name
            {
                get
                {
                    return "someUser";
                }
            }
        }

        public class MockPrincipal : IPrincipal
        {
            IIdentity _identity;

            public IIdentity Identity
            {
                get
                {
                    if (_identity == null)
                    {
                        _identity = new MockIdentity();
                    }
                    return _identity;
                }
            }

            public bool IsInRole(string role)
            {
                return false;
            }
        }

        public class MockMembershipUser : MembershipUser
        {
            public override bool ChangePassword(string oldPassword, string newPassword)
            {
                return newPassword.Equals("newPass");
            }
        }

        public class MockHttpContext : HttpContextBase
        {
            private IPrincipal _user;

            public override IPrincipal User
            {
                get
                {
                    if (_user == null)
                    {
                        _user = new MockPrincipal();
                    }
                    return _user;
                }
                set
                {
                    _user = value;
                }
            }
        }

        //public class MockMembershipProvider : MembershipProvider
        //{
        //    string _applicationName;

        //    public override string ApplicationName
        //    {
        //        get
        //        {
        //            return _applicationName;
        //        }
        //        set
        //        {
        //            _applicationName = value;
        //        }
        //    }

        //    public override bool EnablePasswordReset
        //    {
        //        get
        //        {
        //            return false;
        //        }
        //    }

        //    public override bool EnablePasswordRetrieval
        //    {
        //        get
        //        {
        //            return false;
        //        }
        //    }

        //    public override int MaxInvalidPasswordAttempts
        //    {
        //        get
        //        {
        //            return 0;
        //        }
        //    }

        //    public override int MinRequiredNonAlphanumericCharacters
        //    {
        //        get
        //        {
        //            return 0;
        //        }
        //    }

        //    public override int MinRequiredPasswordLength
        //    {
        //        get
        //        {
        //            return 6;
        //        }
        //    }

        //    public override string Name
        //    {
        //        get
        //        {
        //            return null;
        //        }
        //    }

        //    public override int PasswordAttemptWindow
        //    {
        //        get
        //        {
        //            return 3;
        //        }
        //    }

        //    public override MembershipPasswordFormat PasswordFormat
        //    {
        //        get
        //        {
        //            return MembershipPasswordFormat.Clear;
        //        }
        //    }

        //    public override string PasswordStrengthRegularExpression
        //    {
        //        get
        //        {
        //            return null;
        //        }
        //    }

        //    public override bool RequiresQuestionAndAnswer
        //    {
        //        get
        //        {
        //            return false;
        //        }
        //    }

        //    public override bool RequiresUniqueEmail
        //    {
        //        get
        //        {
        //            return false;
        //        }
        //    }

        //    public override bool ChangePassword(string username, string oldPassword, string newPassword)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    //public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, Object providerUserKey, out MembershipCreateStatus status)
        //    //{
        //    //    MockMembershipUser user = new MockMembershipUser();

        //    //    if (username.Equals("someUser") && password.Equals("goodPass") && email.Equals("email"))
        //    //    {
        //    //        status = MembershipCreateStatus.Success;
        //    //    }
        //    //    else
        //    //    {
        //    //        // the 'email' parameter contains the status we want to return to the user
        //    //        status = (MembershipCreateStatus)Enum.Parse(typeof(MembershipCreateStatus), email);
        //    //    }

        //    //    return user;
        //    //}

        //    public override bool DeleteUser(string username, bool deleteAllRelatedData)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override int GetNumberOfUsersOnline()
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override string GetPassword(string username, string answer)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override string GetUserNameByEmail(string email)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override MembershipUser GetUser(Object providerUserKey, bool userIsOnline)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override MembershipUser GetUser(string username, bool userIsOnline)
        //    {
        //        return new MockMembershipUser();
        //    }

        //    public override string ResetPassword(string username, string answer)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override bool UnlockUser(string userName)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override void UpdateUser(MembershipUser user)
        //    {
        //        throw new NotImplementedException();
        //    }

        //    public override bool ValidateUser(string username, string password)
        //    {
        //        return password.Equals("goodPass");
        //    }

        //}
    }
}
